package com.xq.proxy.cglib;

import lombok.Data;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author xq
 * @version 1.0
 * @date 2021/4/6 12:14
 * @description cglib动态代理的工厂
 */
@Data
public class ProxyFactory implements MethodInterceptor {
    /**
     * 目标对象
     */
    private Object target;

    public ProxyFactory(Object target) {
        super();
        this.target = target;
    }

    /**
     * 前置增强
     */
    public void before() {
        System.out.println("饭前吃水果");
    }

    /**
     * 后置增强
     */
    public void after() {
        System.out.println("饭后散步");
    }

    /**
     * 获取子类代理实例对象
     * @return
     */
    public Object getProxyInstance() {
        // 创建Enhancer工具类
        Enhancer e = new Enhancer();
        // 设置父类
        e.setSuperclass(target.getClass());
        // 返回方法调用
        e.setCallback(this);
        // 创建子类对象并返回
        return e.create();
    }

    /**
     * 拦截器方法
     * @param o 代理对象
     * @param method 目标对象被调用的方法
     * @param args 方法参数列表
     * @param methodProxy 方法代理 对象
     * @return 返回代理对象
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        // 前置增强
        before();
        // 执行目标方法
        Object invoke = method.invoke(target, args);
        // 后置增强
        after();
        return invoke;
    }
}
